package com.hxc.microservice.auth.config;

import com.hxc.microservice.auth.service.CustomerUserDetailService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {



    /**
     *springsecurity中的BCryptPasswordEncoder方法对密码进行加密(encode)与密码匹配(matches)
     *spring security中的BCryptPasswordEncoder方法采用SHA-256 +随机盐+密钥对密码进行加密。
     *SHA系列是Hash算法，不是加密算法，使用加密算法意味着可以解密（这个与编码/解码一样），但是采
     *用Hash处理，其过程是不可逆的
     */
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    //如果需要自定义配置密码加密、解密的方式可参考使用下方注释的代码 (MD5Util类是自己定义的)
    /**
     *@Bean
     *public PasswordEncoder passwordEncoder() {
     *   return new PasswordEncoder() {
     *       @Override
     *       public String encode(CharSequence password) {
     *           return MD5Util.encrypt(password.toString());
     *       }
     *       @Override
     *       public boolean matches(CharSequence password, String encodedPassword) {
     *           //password用户输入的，encodedPassword数据库查出来的
     *           return encodedPassword.equals(MD5Util.encrypt(password.toString()));
     *       }
     *   };
     *}
     */

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        /**
         * antMatchers: ant的通配符规则
         * ?	匹配任何单字符
         * *	匹配0或者任意数量的字符，不包含"/"
         * **	匹配0或者更多的目录，包含"/"
         */
        http.headers().frameOptions().disable();
        http.headers().cacheControl();
        //允许跨域访问并关闭跨站请求防护
        http.cors().and()
                .csrf().disable()
                .authorizeRequests()
                //这里表示放行 oauth 接口不需要权限校验 如获取token的/oauth/token
                //检验token的/oauth/check_token 等
                .antMatchers( "/**/oauth/**").permitAll()
                //放行OPTIONS请求
                .antMatchers(HttpMethod.OPTIONS, "/**").permitAll();
    }


}
